﻿using System;
using System.Collections.Generic;
using System.Data.Objects.DataClasses;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;

namespace xiushen.Tests
{
 
    public class Spider
    {
        private static readonly HttpClient client = new HttpClient();

        public static void Initialize()
        {
            var url = new Uri("http://bbs.artx.cn/logging.php?action=login&loginsubmit=yes&inajax=1");

            var postString =
             "formhash=16c0d5ca&oginfield=username&username=brevin&password=2d3a6c9a0cd83e39c42e845eef369b60&questionid=0&answer=";
            client.PostData(url.ToString(), postString, "gb2312", "gb2312");
        }
        /// Función que hace las veces de robot o spider
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string spider(Uri url)
        {
            // Expresión regular que lee el contenido del href
            string pattern_Href = @"(?<=<a[^<>]+href=""?)[^""<>]+(?=""?[^<>]*>)";

            // Recogemos el contenido de la url como un string
            string html = getHTML(url);

            // Recogemos la colección de resultados que nos da Regex
            MatchCollection col = Regex.Matches(html, pattern_Href, RegexOptions.IgnoreCase);

            StringBuilder sb = new StringBuilder();
            // Añadimos al stringbuilder cada uno de los resultados
            foreach (Match match in col)
            {
                sb.Append(match.Value);
                sb.Append("<br />");
            }

            return sb.ToString();
        }

        /// <summary>
        /// Recoger el contenido de una Uri como string
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string getHTML(Uri url)
        {
            // Absolutamente sencillo!!

            client.Credentials = CredentialCache.DefaultCredentials;

            return client.DownloadString(url);
        }

        /// <summary>
        /// Recoger el contenido de una Uri como string de forma más trabajada
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string getHTML2(Uri url)
        {
            string retorno = string.Empty;

            // Creamos un HttpWebRequest
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Credentials = CredentialCache.DefaultCredentials;
            try
            {
                // Recogemos la respuesta
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    // Leemos el resultado de "Status Code"
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        // Tampoco es demasiado difícil leer el contenido como un string ;)
                        StreamReader sr = new StreamReader(response.GetResponseStream());
                        retorno = sr.ReadToEnd();
                    }
                }
            }
            catch
            { retorno = string.Empty; }

            return retorno;
        }
        /// <summary>
        /// Recoger el contenido de una Uri como string de forma más trabajada
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static byte[] getHTML3(Uri url)
        {
            WebClient wc = new WebClient();
            wc.Credentials = CredentialCache.DefaultCredentials;
            wc.Encoding = Encoding.Default;
            return wc.DownloadData(url);
        }
    }
}